#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

void primes(int p[2]) {
    // 先读第一个数，一定是素数，是由算法决定的
    int first;
    if(read(p[0], &first, 4) == 4) {
        printf("prime %d\n", first);
        int n;
        // 继续读左边管道剩下的数，不能整除就放右管道
        int pr[2]; pipe(pr);
        while(read(p[0], &n, 4) == 4){
            if(n%first != 0){
                write(pr[1], &n, 4);
            }
        }
        close(pr[1]);
        if(fork() == 0) {  // 递归用新进程处理pr中的数
            primes(pr);
        }
        close(pr[0]);
        wait(0);
    }
    exit(0);
}

int
main(int argc, char *argv[])
{
    int p[2];
    pipe(p);
    for(int i = 2; i<= 35; i++){
        write(p[1], &i, 4);
    } // 先把所有数读入初始管道
    close(p[1]); // 关闭写端
    if(fork() == 0){
        primes(p); // 新进程内调用递归方法
    }
    close(p[0]); // 关闭读端
    wait(0); // 等待子进程结束，子进程也需要等待它的子进程结束
    exit(0);
}

